UOJ Logo _rqy的博客

博客

UR#24 T1题解

2023-02-19 19:49:31 By _rqy

考虑判断一个字符串 $s$ 是否满足条件.

令 $G(s)_c$ 表示 $s$ 的以 $c$ 结尾的本质不同子序列个数, $G(s)_0$ 表示总的本质不同子序列个数. 那么若 $s = s' + a$ (字符串拼接), 则有

$$G(s)_c = \begin{cases} G(s')_0 & c = a, \\ G(s')_c & c \ne a, 0. \end{cases}$$

$$\begin{aligned} G(s)_0 &= 1 + \sum_{c \ne 0} G(s)_c \\ &= 1 + \sum_{c \ne 0, a} G(s')_c + G(s')_0 \\ &= 2G(s')_0 - G(s')_a \equiv G(s')_a \pmod{2} \end{aligned}$$

我们发现, 在模 $2$ 意义下在字符串后面加一个字符 $a$ 就是交换 $G$ 中 $0$ 和 $a$ 的值. 而最初的时候 $G(\varnothing)_c = [c=0]$, 所以只需要判断最后是否把 $0$ 换回 $0$.

那么我们在树上做的时候,只需要对每个结点 $i$ 和每个字符 $c$ 维护:

  • 子树内有多少结点 $j$, 满足从 $i$ 走到 $j$ 会把 $G(s')_c$ 换到 $G(s)_0$;
  • 子树内有多少结点 $j$, 满足从 $j$ 走到 $i$ 会把 $G(s')_0$ 换到 $G(s)_c$.

两棵子树合并的时候把对应位置乘起来统计答案, 往上走的时候交换两个位置的值即可.

更新:

可以发现连放两个相同字符等于不放. 所以可以把 i 到 j 改成 i 到根再到 j.

dfs 时可以维护当前点到根的置换. 这样就可以 $O(n)$ 求出每个点到根会把 $0$ 换成谁 (这也等价于从根到它会把谁换成 $0$). 最后统计答案即可.

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。